package 算法基础模板.chapter_01;

import java.util.Scanner;

/**
 * 快排是分治思想, 分治思想有三步
 *
 * 1  分成子问题
 * 2  递归处理子问题
 * 3  子问题合并
 *
 * https://www.acwing.com/solution/content/16777/
 * @author Summerday
 */
public class QuickSortTemplate {

    static int n;
    static int[] nums;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        nums = new int[n];
        for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
        // 入口
        quickSort(nums, 0, n - 1);

        for (int i = 0; i < n; i++) System.out.print(nums[i] + " ");
    }

    static void quickSort(int[] nums, int l, int r) {
        // 递归终止情况
        if (l >= r) return;
        // 分成子问题
        int x = nums[l + r >> 1], i = l - 1, j = r + 1;
        while (i < j) {
            // do while 循环 i 和 j 一定会自增,不会死循环
            do i++; while (nums[i] < x);
            do j--; while (nums[j] > x);
            if (i < j) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
        // while循环退出时满足 : nums[l..j] <= x  , nums[j + 1, r] >= x

        // 递归处理子问题
        quickSort(nums, l, j);
        quickSort(nums, j + 1, r);
        // 子问题合并, 快排不需要这一步, 归并排序的核心在这一步骤
    }

}
